% 数据归一化处理脚本
% 使用训练集的均值和标准差对训练集和测试集进行归一化

% 步骤1: 加载训练数据和测试数据
train_data = load('train.mat');
test_data = load('test.mat');

% 提取数据矩阵
train_matrix = train_data.data;
test_matrix = test_data.data;

% 步骤2: 分离标签和特征
train_labels = train_matrix(:, 1);  % 第一列是标签
train_features = train_matrix(:, 2:end);  % 其余列是特征

test_labels = test_matrix(:, 1);    % 第一列是标签
test_features = test_matrix(:, 2:end);  % 其余列是特征

% 步骤3: 计算训练集的归一化参数
feature_means = mean(train_features, 1);  % 每列的均值
feature_stds = std(train_features, 0, 1); % 每列的标准差

% 处理标准差为0的特征（避免除以0）
feature_stds(feature_stds == 0) = 1;  % 将标准差为0的设为1，避免除法错误

% 步骤4: 归一化训练集特征
norm_train_features = (train_features - feature_means) ./ feature_stds;

% 步骤5: 使用相同的参数归一化测试集特征
norm_test_features = (test_features - feature_means) ./ feature_stds;

% 步骤6: 重新组合标签和归一化后的特征
norm_train_data = [train_labels, norm_train_features];
norm_test_data = [test_labels, norm_test_features];

% 步骤7: 保存归一化后的数据（可选）
save('norm_train.mat', 'norm_train_data');
save('norm_test.mat', 'norm_test_data');

% 步骤8: 显示归一化结果摘要
fprintf('数据归一化完成:\n');
fprintf('训练集尺寸: %d 样本 x %d 特征\n', size(norm_train_data));
fprintf('测试集尺寸: %d 样本 x %d 特征\n', size(norm_test_data));
fprintf('特征均值范围: [%.4f, %.4f]\n', min(feature_means), max(feature_means));
fprintf('特征标准差范围: [%.4f, %.4f]\n', min(feature_stds(feature_stds>0)), max(feature_stds));